package com.hejia.alauda.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.data.mongodb.core.MongoTemplate;

import com.alibaba.fastjson.JSONObject;
import com.hejia.alauda.entity.BonusOrder;
import com.hejia.alauda.entity.BonusRecord;
import com.hejia.alauda.entity.User;
import com.hejia.alauda.mongodb.IwxTicket;
import com.hejia.alauda.utils.Pager;
import com.umeng.config.UmengConfig;

/**
 * 红包服务
 * 
 * @author hyr
 *
 */
public interface BonusService {
	
	/**
	 * 查询用户此笔订单可提现红包
	 * 
	 * @param orderNumber
	 *            订单号
	 * @return 可提现红包列表
	 */
	List<BonusRecord> findCanCashBonusesByOrderNumber(String orderNumber);

	/**
	 * 提现红包
	 * 
	 * @param orderNumber
	 *            订单号
	 * @param bonusRecordIds
	 *            红包ID集合
	 */
	void cashBonus(String orderNumber, Long[] bonusRecordIds);

	/**
	 * 统计同类可提现红包数量与金额
	 * 
	 * @param bonusRecordId
	 *            红包记录ID
	 * @return
	 */
	Map<String, Object> countCanCashBonusesByBonusRecordId(Long bonusRecordId);

	/**
	 * 查询红包记录
	 * 
	 * @param bonusRecordId
	 *            红包记录ID
	 * @return 红包记录
	 */
	BonusRecord findBonusRecordById(Long bonusRecordId);

	/**
	 * 支付完成后，是否可继续提现红包
	 * 
	 * @param orderId
	 *            订单ID
	 * @return true - 可以，false - 不可以
	 */
	boolean enableContinueCashBunus(Long orderId);

	/**
	 * 计算可提现红包数量
	 * 
	 * @param orderId
	 *            订单ID
	 * @return 可提现红包数量
	 */
	Integer getEnableCashBonusCount(Long orderId);

	/**
	 * 查询订单激活的第一笔红包
	 * 
	 * @param orderId
	 *            订单ID
	 * @return
	 */
	BonusRecord findOrderFirstBonus(Long orderId);

	/**
	 * 查询红包记录
	 * 
	 * @param pager
	 * @param keyword
	 *            关键词
	 * @param consume
	 *            是否激活
	 * @return
	 */
	Pager<BonusRecord> findBonusRecords(Pager<BonusRecord> pager,
			String keyword, Boolean consume);

	/**
	 * 提现红包
	 * 
	 * @param bonusRecordId
	 *            红包ID
	 * @param orderId
	 *            订单ID
	 */
	void cashBonus(Long bonusRecordId, Long orderId);

	/**
	 * 根据订单id查询用户此笔订单可提现红包
	 * 
	 * @param orderId
	 * 
	 * @return
	 */
	List<BonusOrder> findBonusOrdersByOrderId(Long orderId);

	/**
	 * 根据红包策略添加红包记录
	 * 
	 * @param user	用户
	 * @param code	红包策略编码
	 * @param amount 红包金额
	 * @return true - 添加成功，false - 添加失败
	 */
	BonusRecord addBonusRecordByRedpacket(User user, String code, BigDecimal amount);

	/**
	 * 查询1天到期推送消息红包ID列表
	 * @return
	 */
	List<Long> findOneDayExpirePushAlertBonusRecordIds();

	/**
	 * 发送1天过期红包推送消息提醒
	 * @param bonusRecordId 红包ID
	 * @throws Exception 
	 */
	void sendOneDayExpirePushAlert(UmengConfig umengConfig, Long bonusRecordId) throws Exception;

	/**
	 * 查询1天到期短信提醒红包ID列表
	 * @return
	 */
	List<Long> findOneDayExpireSmsAlertBonusRecordIds();

	/**
	 * 发送1天过期红包短信提醒
	 * @param bonusRecordId 红包ID
	 */
	void sendOneDayExpireSmsAlert(Long bonusRecordId);

	/**
	 * 查询7天到期推送消息红包ID列表
	 * @return
	 */
	List<Long> findSevenDayExpirePushAlertBonusRecordIds();

	/**
	 * 发送7天过期红包推送消息提醒
	 * @param bonusRecordId 红包ID
	 * @throws Exception 
	 */
	void sendSevenDayExpirePushAlert(UmengConfig umengConfig, Long bonusRecordId) throws Exception;

	/**
	 * 是否已发送生日红包
	 * @param userId 用户ID
	 * @param birthday 生日
	 * @return	true：已发送，false：未发送
	 */
	boolean isSendedBirthdayBonus(Long userId, Date birthday);

	/**
	 * 发送用户生日红包
	 * @param userId	用户ID
	 * @param birthday	生日
	 */
	void sendBirthdayBonus(Long userId, Date birthday);
	
	/**
	 * 插入用户红包
	 * @param bonusRecord
	 */
	void insertBonusRecord(BonusRecord bonusRecord);
	
	/**
	 * 初始化抢红包的数据
	 */
	boolean generateBonusTicket();
	
	/**
	 * 查询抢红包的列表
	 * @return
	 */
	List findBonusTicket(String key, JSONObject config);
	
	/**
	 * 更新
	 * @param iwxTicket
	 */
	void updateIwxTicket(IwxTicket iwxTicket);
	
	/**
	 * 未使用红包
	 * @param user
	 * @return
	 */
	Integer countUnusedBonusRecordByUser(User user);
}
